package com.lizhi.note.payload;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 统一 API 响应格式
 * @param <T> 响应数据类型
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApiResponse<T> {
    private int statusCode;          // 业务状态码（200=成功，非200=失败）
    private String message;    // 响应消息
    private boolean success;   // 是否成功
    private T data;            // 响应数据（成功时填充）
    private LocalDateTime timestamp; // 时间戳

    // ------------------------ 成功响应 ------------------------
    /**
     * 成功响应（带数据）
     */
    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(
                200,
                "操作成功",
                true,
                data,
                LocalDateTime.now()
        );
    }

    /**
     * 成功响应（无数据，如 DELETE 请求）
     */
    public static <T> ApiResponse<T> success() {
        return success((T) null);
    }

    /**
     * 成功响应（自定义消息）
     */
    public static <T> ApiResponse<T> success(String message, T data) {
        return new ApiResponse<>(200, message, true, data, LocalDateTime.now());
    }

    // ------------------------ 失败响应 ------------------------
    /**
     * 失败响应（带错误码和消息）
     */
    public static <T> ApiResponse<T> error(int code, String message) {
        return new ApiResponse<>(code, message, false, null, LocalDateTime.now());
    }

    /**
     * 失败响应（自定义数据，如验证错误详情）
     */
    public static <T> ApiResponse<T> error(int code, String message, T details) {
        return new ApiResponse<>(code, message, false, details, LocalDateTime.now());
    }

    /**
     * 系统异常响应（默认 500 错误）
     */
    public static <T> ApiResponse<T> systemError(String message) {
        return error(500, "系统异常：" + message);
    }
}
